AWS CLIでサービスの各種コマンドを動かしてみる(IAM編1: グループ)
AWS SDKには数多くのAPIやライブラリツールが提供されていますが、個人的にはAWS Command Line Interface(aws-cli)が使い勝手が良いなぁ〜、と思ってたりします。その理由はポイントはコード補完が効き、そのサービスで利用出来るコマンドの全容、ひいては『どのような要素があり、どのような操作が出来るのか』といった点が把握しやすい点があるからです。
aws-cli以外の各種APIにもドキュメントはありますが、一覧性(1画面内に要素が大体収まる)、即興性(コマンド実行で直ぐ出る、ヘルプもコマンドで利用可能)等を考えると、リファレンスとしての使い勝手としても良い方なのではないでしょうか。(と個人的には思っております)
ここでは、その『aws-cli』を主に用いて、AWSのサービスや機能について少しずつ紐解いていき、理解を深めて行きたいと思います。aws-cli自体、まだDeveloper Preview版と言う事もあるので、ひとまずはざっくり以下の様な流れで進めて行こうかなと。
- aws-cliのコマンド一覧から全容を把握する
- aws-cliを使って様々なコマンドを実践してみる
- aws-cliは現時点でプレビュー版(Developer Preview)の為、多分意図・想定通りに動かない(または動かし方が分からない)場合もあると思うので、その辺躓いた部分も何らかの形で記録として残す
- aws-cliで実行出来なかった部分・情報収集し切れなかった部分に関しては、手軽さ、使い易さを考慮してAWS SDK for JavaでGroovy経由で別途触って理解を深めてみる
ではでは、まず最初のエントリ。IAMについてです。
IAM(Identify and Access Management)
AWS Identity and Access Management (IAM) Preview Beta | アマゾン ウェブ サービス(AWS 日本語)
IAMは、AWSでユーザーとユーザーのアクセス権限を管理出来るようにするサービスです。ユーザー、グループ、ロール等の特定エンティティに対し、『ポリシー』という所定の書式に従った、1つ以上のアクセス権限を記述したドキュメントを用いる事によって柔軟な制御・管理を行う事が出来ます。
awscliでiamのコマンドを見てみましょう。2013年07月頭現在で合計69個提供されています。
$ aws iam add-role-to-instance-profile delete-user list-role-policies add-user-to-group delete-user-policy list-roles change-password delete-virtual-mfa-device list-server-certificates create-access-key enable-mfa-device list-signing-certificates create-account-alias get-account-password-policy list-user-policies create-group get-account-summary list-users create-instance-profile get-group list-virtual-mfa-devices create-login-profile get-group-policy put-group-policy create-role get-instance-profile put-role-policy create-user get-login-profile put-user-policy create-virtual-mfa-device get-role remove-role-from-instance-profile deactivate-mfa-device get-role-policy remove-user-from-group delete-access-key get-server-certificate resync-mfa-device delete-account-alias get-user update-access-key delete-account-password-policy get-user-policy update-account-password-policy delete-group list-access-keys update-assume-role-policy delete-group-policy list-account-aliases update-group delete-instance-profile list-group-policies update-login-profile delete-login-profile list-groups update-server-certificate delete-role list-groups-for-user update-signing-certificate delete-role-policy list-instance-profiles update-user delete-server-certificate list-instance-profiles-for-role upload-server-certificate delete-signing-certificate list-mfa-devices upload-signing-certificate $
そしてここからは上記コマンドを処理対象要素別に振り分け、要素別にそれぞれ紐解いて行こうと思います。
なお、エントリで処理対象となる"キーワード"についてはこの辺りの公式ページが詳しかったりします。
IAM:グループ(group)に関する操作
グループに関するaws-cliのコマンドは以下6個。
create-group delete-group get-group list-groups list-groups-for-user update-group
グループとは、AWSに於ける同じような責任を持つユーザをひとまとめにしたもの。コマンドを見てみてもシンプルにグループに関する操作が提供されているようですね。
create-group
グループを作成。最低限、グループ名の指定だけで作成する事が出来ます。
$ aws iam create-group --group-name awscli-iam-group { "Group": { "Path": "/", "CreateDate": "2013-07-02T13:45:44.288Z", "GroupId": "AGPAIRFH66PUNROSHQ3XK", "Arn": "arn:aws:iam::317282958305:group/awscli-iam-group", "GroupName": "awscli-iam-group" }, "ResponseMetadata": { "RequestId": "b12e89de-e31d-11e2-af3f-f58037e41cee" }
delete-group
指定のグループを削除。こちらもグループ名指定のみ。
$ aws iam delete-group --group-name awscli-iam-group { "ResponseMetadata": { "RequestId": "e8a9b963-e31d-11e2-805f-95793b858121" } }
ちなみに存在しないグループ名を指定した場合は以下のように怒られます。
$ aws iam delete-group --group-name no-exist-group { "Errors": [ { "Message": "The group with name no-exist-group cannot be found.", "Code": "NoSuchEntity", "Type": "Sender" } ], "ResponseMetadata": { "RequestId": "16e497c8-e31e-11e2-ba36-0f251103ce0b" } }A client error (NoSuchEntity) occurred: The group with name no-exist-group cannot be found.
get-group
グループ情報を取得。グループ名を引数に取り、結果としてグループ情報を受け取ります。
以下のようにGroovyで実行してみると、ちゃんと結果を受け取れるのですが…(※getInstance()メソッドでCredential情報を設定したIAMクライアントインスタンスを取得しています)
(IAMUtil.groovyクラスに実装したメソッド) public static Group createGroup(String groupName) { CreateGroupRequest createGroupRequest = new CreateGroupRequest().withGroupName(groupName); CreateGroupResult result = getInstance().createGroup(createGroupRequest); return result.group; } ------------------ (実行) IAMUtil.createGroup("iam-test-group"); Group group = IAMUtil.getGroup("iam-test-group"); println "groupId :" + group.groupId; println "groupName :" + group.groupName; println "arn :" + group.arn; println "path :" + group.path; println "createDate:" + group.createDate; ------------------ (結果) groupId :AGPAICGLWQWNZMPTKJCW4 groupName :iam-test-group arn :arn:aws:iam::317282958305:group/iam-test-group path :/ createDate:Tue Jul 02 23:01:11 JST 2013
aws-cliで実行してみると、なぜか空?の状態で帰って来ます。メソッド名的には単数形(で結果が返ってくる)なのだとは思いますがヘルプに復数件数取得で使うであろうパラメータがあるのも気になると言えば気になるところです。
$ aws iam get-group --group-name iam-test-group [ "Path", "CreateDate", "GroupId", "Arn", "GroupName" ]
list-groups
特定のプレフィックス文字列に該当するグループ名称の一覧を取得します。グループの属性情報の1つである『パス(path)』をプレフィックス文字列で検索する事も出来るようです。
$ aws iam list-groups | jq length 7 $ aws iam list-groups --path-prefix /home/ [ { "Path": "/home/dev/", "CreateDate": "2013-07-02T02:25:26Z", "GroupId": "AGPAI4VUDQKORDUBVM5NM", "Arn": "arn:aws:iam::317282958305:group/home/dev/iam-group-test", "GroupName": "iam-group-test" } ]
list-groups-for-user
ユーザーが所属するグループの一覧を取得します。管理コンソール経由で、以下の様なグループとユーザーをまず作ってみました。user-eが復数グループに所属する形となっています。
user-a/user-eそれぞれでコマンドを実行してみます。
$ aws iam list-groups-for-user --user-name user-a | jq ".[].GroupName" "ec2usergroup" $ aws iam list-groups-for-user --user-name user-e | jq ".[].GroupName" "ec2usergroup" "s3usergroup"
update-group
グループ情報に関する更新を行います。コマンドヘルプを見ると、以下2点の更新が行えるようです。
- パス(new-path)
- グループ名(new-group-name)
$ aws iam create-group --group-name iam-group-for-update (更新用のグループを作成) { "Group": { "Path": "/", "CreateDate": "2013-07-02T14:42:00.758Z", "GroupId": "AGPAIJNBFVT7M4AAIPHHK", "Arn": "arn:aws:iam::317282958305:group/iam-group-for-update", "GroupName": "iam-group-for-update" }, "ResponseMetadata": { "RequestId": "8dacbfcc-e325-11e2-8752-c73aa4f68d6d" } } $ aws iam update-group --group-name iam-group-for-update --new-path /home/divA/divB/ (パス情報を更新) { "ResponseMetadata": { "RequestId": "ad138950-e325-11e2-8752-c73aa4f68d6d" } } $ aws iam list-groups --path-prefix /home/div (更新したパスで検索を行い、該当のグループが引っ張れる事を確認) [ { "Path": "/home/divA/divB/", "CreateDate": "2013-07-02T14:42:00Z", "GroupId": "AGPAIJNBFVT7M4AAIPHHK", "Arn": "arn:aws:iam::317282958305:group/home/divA/divB/iam-group-for-update", "GroupName": "iam-group-for-update" } ] $ aws iam update-group --group-name iam-group-for-update --new-group-name iam-group-updated (グループ名の更新) { "ResponseMetadata": { "RequestId": "024eff4c-e326-11e2-8fe2-a91a74ec1b95" } } $ aws iamlist-groups --path-prefix /home/div (改めてパス情報で検索、グループ名が変わっている事を確認) [ { "Path": "/home/divA/divB/", "CreateDate": "2013-07-02T14:42:00Z", "GroupId": "AGPAIJNBFVT7M4AAIPHHK", "Arn": "arn:aws:iam::317282958305:group/home/divA/divB/iam-group-updated", "GroupName": "iam-group-updated" } ] $
IAM:グループポリシー(group-policy)に関する操作
グループポリシーに関するaws-cliのコマンドは以下5個。
put-group-policy get-group-policy delete-group-policy list-group-policies
ポリシーとは、所定の書式に従った、1つ以上のアクセス権限を記述したドキュメントを指します。書き方の解説は以下公式ドキュメントをご参照ください。
- ポリシーの書き方 - AWS Identity and Access Management
- エレメントの説明 - AWS Identity and Access Management
- IAM エンティティにおける制限 - AWS Identity and Access Management
- アクセスポリシー言語 - AWS Identity and Access Management
という事なので、グループポリシーはこれらアクセス権限制御情報がグループに紐付たものになる訳ですね。
put-group-policy
グループにポリシーを付加します。管理コンソール上では[Permissions]タブからGUIで追加、編集が可能ですが、ここではそれらの操作をAPI経由で試してみます。適当なグループを作成し、ポリシードキュメントの雛型が表示されたら、その内容をコピペして別途テキストファイルに保存しておきます。ここではjsonファイルとしました。
$ vi PowerUserAccess.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "NotAction": "iam:*", "Resource": "*" } ] }
aws-cliでは、JSON形式のファイル(リストや構造化された状態のもの)に関しては、ファイル参照やURL参照の形でコマンド引数に利用する事が出来ます。上記で作成したファイルをfile://形式で参照させ、コマンド実行。
aws iam put-group-policy --group-name powerusergroup --policy-document file://PowerUserAccess.json --policy-name Policy-PowerUserAccess { "ResponseMetadata": { "RequestId": "9194f95d-e334-11e2-8fe2-a91a74ec1b95" } } $
ちゃんと更新されていますね。Groovyではこんな感じ。参照するポリシーファイルは同じものを利用しています。
Class IAMUtil { : : public static void putGroupPolicy(String groupName, String policyName, String policyFilePath) { PutGroupPolicyRequest putGroupPolicyRequest = new PutGroupPolicyRequest() .withGroupName(groupName) .withPolicyName(policyName) .withPolicyDocument(policyFile.getText()); getIamInstance().putGroupPolicy(putGroupPolicyRequest); } } --------- IAMUtil.putGroupPolicy("powerusergroup","PolicyPowerUserAccess","/Users/xxxx/aws/Policy-PowerUserAccess.json");
get-group-policy
グループポリシー情報を取得。グループ名及びポリシー名を指定します。
$ aws iam get-group-policy --group-name powerusergroup --policy-name PolicyPowerUserAccess { "GroupName": "powerusergroup", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "NotAction": "iam:*", "Resource": "*", "Effect": "Allow" } ] }, "ResponseMetadata": { "RequestId": "14baceeb-e372-11e2-af3f-f58037e41cee" }, "PolicyName": "PolicyPowerUserAccess" }
delete-group-policy
ポリシーを削除します。ポリシーにエンティティが紐付けられていた場合エラーとなりますので事前にエンティティの削除が必要となります。
$ aws iam delete-group --group-name powerusergroup { "Errors": [ { "Message": "Cannot delete entity, must delete policies first.", "Code": "DeleteConflict", "Type": "Sender" } ], "ResponseMetadata": { "RequestId": "1a15ef24-e375-11e2-805f-95793b858121" } }A client error (DeleteConflict) occurred: Cannot delete entity, must delete policies first. $ aws iam list-group-policies --group-name powerusergroup [ "PolicyPowerUserAccess", "PolicyPowerUserAccess2nd" ] $ aws iam delete-group-policy --group-name powerusergroup --policy-name PolicyPowerUserAccess { "ResponseMetadata": { "RequestId": "bdcaf5d9-e375-11e2-8fe2-a91a74ec1b95" } } $ aws iam delete-group-policy --group-name powerusergroup --policy-name PolicyPowerUserAccess2nd { "ResponseMetadata": { "RequestId": "c1c0e897-e375-11e2-8a03-a9df50e5b4b7" } } $ aws iam delete-group --group-name powerusergroup { "ResponseMetadata": { "RequestId": "cf5c561f-e375-11e2-885e-7117b4d431d8" } } $
list-group-policies
グループに設定されているポリシー名の一覧を取得します。
$ aws iam list-group-policies --group-name sample-admins-group [ "AmazonDynamoDBFullAccess-sample-admins-group-201307030906", "AmazonElastiCacheFullAccess-sample-admins-group-201307030907", "AmazonRedshiftFullAccess-sample-admins-group-201307030907", "AmazonS3FullAccess-sample-admins-group-201307030906" ]
まとめ
以上、IAMのグループに関するAWS CLIコマンドでした。このシリーズは不定期ではありますが、更新出来る時に適宜更新して行きたいと思います。目指すは全サービス全コマンド制覇!ですが、一体いつの話になることやら...w 首を長〜くして生暖かい目で見て頂ければと思います。また実践内容についても状況が変わった(出来なかったものが出来るようになった、または逆のパターン等)場合についても、判明次第該当箇所の更新は行っていこうと思います。よろしくお願いします。